/**
 * 小写转大写工具类
 * @type {MoneyUtil}
 */
MoneyUtil =new function(){
    var CN_Digits = new Array( "零", "壹", "貳", "叁", "肆", "伍", "陆", "柒", "捌", "玖" );
    /**
     * 方法入口
     * @param moneyObj 要转换的值或对象
     *      参数格式：
     *          1、传对象例如MoneyUtil.toCNValue(this)或MoneyUtil.toCNValue($("#xx"))或
     *              MoneyUtil.toCNValue(document.getElementById("xxx"))或MoneyUtil.toCNValue(ID("#xxx"))
     *          2、传指定字符toCNValue("123456.87")。
     * @param obj  将转换后的大写回显到某个元素上
     *      参数格式：
     *          1、传对象例如toCNValue(this)或toCNValue($("#xx"))。
     *          2、传ID例如toCNValue(ID("#xxx"))
     *      此参数可以不填,如果不填默认将回显的内容返回到调用方
     * @returns {*}
     */
    this.toCNValue = function(moneyObj,obj) {
        if(!(moneyObj instanceof Object)){
            moneyObj+="";
        }
        var element = $(moneyObj);
        if (element != null && element.length > 0) {
            moneyObj = element.val();
        }
        var cn = CNValueOf(moneyObj);
        obj = $(obj);
        if (obj != null && obj.length > 0) {
            obj.text(cn);
            return "";
        }else{
            return cn;
        }
    }
    /**
     * 转换核心方法
     * @param moneyValue
     * @param obj
     * @returns {*}
     */
    function CNValueOf(moneyValue) {
        if(!(/^\d*(\.\d*)?$/.test(moneyValue))) {
            return "请输入正确的数字";
        }
        var value = moneyValue.replace(/(^0*)/g, "");
        value = value.replace(" ,", "");
        if(value==""){
            return "零元整";
        }
        var dot_pos = value.indexOf('.');
        var var_value;
        var fraction_value;
        if (dot_pos == -1) {
            var_value = value;
            fraction_value = "00";
        } else {
            var_value = value.substring(0, dot_pos);
            fraction_value = (value.substring(dot_pos + 1, value.length)) + ("00".substring(0, 2));
        }
        var len = var_value.length;
        if (len > 16) {
            return "值过大";
        }
        var cn_currency = "";
        var CN_Carry = new Array("", "万", "亿", "万")
        var cnt = parseInt(len / 4 + (len % 4 != 0 ? 1 : 0));
        var partLen = parseInt(len - (cnt - 1) * 4);
        var partValue = null;
        var bZero = false;
        var curCN = null;
        for (var i = 0; i < cnt; i++) {
            partValue = var_value.substring(0, partLen);
            var_value = var_value.substring(partLen);
            curCN = Part2CN(partValue, i != 0 && "零" != (curCN));
            if (bZero && !"零" == (curCN)) {
                cn_currency += ("零");
                bZero = false;
            }
            if ("零" == curCN){
                bZero = true;
            }
            if ("零" != curCN) {
                cn_currency += (curCN);
                cn_currency += (CN_Carry[cnt - 1 - i]);
            }
            partLen = 4;
            partValue = null;
        }

        cn_currency += "元";
        var fv1 = fraction_value.substring(0, 1);
        var fv2 = fraction_value.substring(1, 2);
        if (fv1 + fv2 == 0) {
            cn_currency += "整";
        } else {
            cn_currency += CN_Digits[fv1] += "角";
            cn_currency += CN_Digits[fv2] += "分";
        }
        return cn_currency;
    }

    /**
     * 为CNValueOf服务不能调用
     * @param partValue
     * @param bInsertZero
     * @returns {*}
     * @constructor
     */
    function Part2CN (partValue,bInsertZero){
        partValue = partValue.replace(/(^0*)/g, "");
        var len = partValue.length;
        if (len == 0){
            return "零";
        }
        var sbResult ="";
        var CN_Carry = new Array( "", "拾", "佰", "仟");
        for (var i = 0; i < len; i++) {
            var digit = parseInt(partValue.substring(i, i + 1));
            if (digit != 0) {
                sbResult+=CN_Digits[digit];
                sbResult+=CN_Carry[len - 1 - i];
            } else if (i != len - 1 && parseInt(partValue.substring(i + 1, i + 2)) != 0) {
                sbResult += "零";
            }
        }
        if (bInsertZero && len != 4) {
            sbResult = "零" + sbResult;
        }
        return sbResult;
    }
};
